package com.pci.netty.dto;

import com.pci.netty.enums.MessageTypeEnum;
import io.netty.buffer.ByteBuf;
import io.netty.buffer.Unpooled;
import io.netty.util.ReferenceCountUtil;
import lombok.Data;

@Data
public class RequestPayload {
    /**
     * 包头
     */
    private byte[] head;
    /**
     * 包体
     */
    private String data;
    /**
     * 校验码
     */
    private String checkCode;

    public RequestPayload(byte[] head, String data, String checkCode) {
        this.head = head;
        this.data = data;
        this.checkCode = checkCode;
    }

    /**
     * 解析包头成 Header类
     *
     * @param head
     * @return
     */
    public static Header analysis(byte[] head) {
        ByteBuf headerBuf = Unpooled.wrappedBuffer(head);
        Header header = new Header(headerBuf);
        return header;
    }

    @Data
    public static class Header {
        /**
         * 功能码
         */
        private byte[] msgCode;
        /**
         * 发起方标识码
         * 由线路+车站+设备类型+设备ID组成，8位数字字符。
         * 例如：19012201
         */
        private byte[] requestSeq;
        /**
         * 接收方标识码
         * 由线路+车站+设备类型+设备ID组成，8位数字字符。
         * 例如：19012203
         */
        private byte[] responseSeq;
        /**
         * 会话流水号
         */
        private int seq;
        /**
         * 请求应答标志
         * 应答时，发起和接受标识与请求包相同
         */
        private byte replyMark;
        /**
         * 应答码
         */
        private byte replyCode;

        public Header(ByteBuf header) {
            this.msgCode = new byte[2];
            this.requestSeq = new byte[4];
            this.responseSeq = new byte[4];
            header.readBytes(msgCode);
            header.readBytes(requestSeq);
            header.readBytes(responseSeq);
            this.seq = header.readInt();
            this.replyMark = header.readByte();
            this.replyCode = header.readByte();
            ReferenceCountUtil.release(header);
        }
    }
}
